'use strict';

const Service = require('egg').Service;

class SysMenuService extends Service {
  // 查询所有菜单树
  async tree() {
    try {
      const res = await this.ctx.model.SysMenu.findAll({
        order: [["sort", "ASC"]], // 菜单按sort排序
      });
      return this.ctx.helper.ormSuccess(res);
    } catch (err) {
      return this.ctx.helper.ormError(err);
    }
  }


  /**
   * @description 创建菜单
   * @param {SysMenuDto.createDto} 参数
   */
  async create(params) {
    try {
      // 查询权限是否存在
      const existDate = await this.ctx.model.SysMenu.findOne({
        where: {
          perm: params.perm
        }
      })
      if(existDate) throw '权限值已被使用';
      await this.ctx.model.SysMenu.create(params);
      return this.ctx.helper.ormSuccess();
    } catch(err) {
      return this.ctx.helper.ormError(err);
    }
  }

  /**
   * @description 编辑
   * @param {*} id 惨淡id
   * @param {SysMenuDto.editDto} 参数
   * @returns 
   */
  async edit(id,params) {
    try {
      const editEntity = await this.ctx.model.SysMenu.findByPk(id);
      if(!editEntity) throw '菜单不存在';
      
      console.log(params, editEntity)

      await editEntity.update(params);
      return this.ctx.helper.ormSuccess();
    } catch(err) {
      return this.ctx.helper.ormError(err);
    }
  }

  /**
   * @description 删除菜单（物理删除）
   * @param {*} id 
   * @returns 
   */
  async del(id) {
    try {
      const entity = await this.ctx.model.SysMenu.findByPk(id);
      if(!entity) throw '菜单不存在';
      // 查询是否存在子菜单
      const res = await this.ctx.model.SysMenu.count({
        where: {
          parentId: id
        }
      })
      if(res > 0) throw '该菜单存在未删除的子菜单，无法删除';
      const bindRes = await this.ctx.model.SysRoleMenu.count({
        where: {
          menuId: id
        }
      })
      if(bindRes > 0) throw '该菜单已被使用，无法删除';
      await this.ctx.model.SysMenu.destroy({
        where: {
          id
        }
      })
      return this.ctx.helper.ormSuccess();
    } catch(err) {
      return this.ctx.helper.ormError(err);
    }
  }

  /**
   * @description 根据角色ID获取菜单ID
   * @param {*} roleId 
   * @returns 
   */
  async getMenuIdByRole(roleId) {
    try {
      const _res = await this.ctx.model.SysRoleMenu.findAll({
        where: {
          roleId
        }
      })
      const res = this.ctx.helper.deepCopy(_res);
      const menuIds = res.map(item => item.menuId);
      console.log('菜单id', res, menuIds)
      return this.ctx.helper.ormSuccess(menuIds)
    } catch(err) {
      return this.ctx.helper.ormError(err);
    }
  }
}

module.exports = SysMenuService;
